﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace KlientModel
{
    // denne klasse ville man rigtig have lagt i et controllerlag 
    public class Remote
    {
        // forbindelse til server, så vi kan skrive og modtage data
        NetworkStream stream;
        StreamWriter writer;
        StreamReader reader;
        TcpClient server;

        // broadcasting af bud til alle klienter
        public delegate void broadcastEvent(string besked);
        public event broadcastEvent budEvent;
        
        // oprettelse af forbindelse til server
        public void connection(string ip, int port)
        {
             server = new TcpClient(ip, port);

             stream = server.GetStream();
             writer = new StreamWriter(stream);
             reader = new StreamReader(stream);          
        }

        // lukker forbindelsen til serveren
        public void disconnect()
        {
            stream.Close(); 
            writer.Close(); 
            reader.Close();
            server.Close(); 
        }

        // kalder kommandoen hentKommendeAuktioner fra serveren og laver en liste af strings
        public List<string> HentAuktioner()
        {
            List<string> kommendeauktioner = new List<string>(); 

            writer.WriteLine("hentKommendeAuktioner");
            writer.Flush();
            while (reader.ReadLine() != null)
            {
                kommendeauktioner.Add(reader.ReadLine()); 
            }

            return kommendeauktioner; 
        }

        // kalder kommandoen seVundneAuktioner fra serveren og laver en liste af strings
        public List<string> SeVundneAuktioner()
        {
            List<string> vundneAuktioner = new List<string>();
            writer.WriteLine("seVundneAuktioner");
            writer.Flush();
            while (reader.ReadLine() != null)
            {
                vundneAuktioner.Add(reader.ReadLine()); 
            }

            return vundneAuktioner; 
        }

        // kalder kommandoen hentAktuelAuktion henter kun en enkelt string, med den nuværende aktive auktion
        public void HentAktuelAuktion()
        {
            writer.WriteLine("hentAktuelAuktion");
            writer.Flush();
        }

        // kalder kommandoen afgivbud, serveren modtager bud og ip fra klienten 
        public void afgivbud(int bud, string ip)
        {
            writer.WriteLine("bud " + bud + " " + ip);
            writer.Flush();
        }

        // Methode til at modtage input fra serveren (bla. broadcasts) - skal køre i egen tråd
        public void BeskedModtager()
        {
            string besked;
            while (reader.ReadLine() != null)
            {
                besked =  reader.ReadLine();
                budEvent(besked);

            }
        }

    }
}
